// 对象：通过 接口/type 定义类型。

// type关键字：自定义新类型，当ts内置类型满足不了需求的时候，自定义类型。
type User = {
  uname: string; // 必选属性；只要是属于User类型的值，必须设置这个属性。
  uage: number; // 必选属性；只要是属于User类型的值，必须设置这个属性。
  usex?: boolean; // 可选属性；只要是属于User类型的值，可以设置，也可以不设置这个属性。
};

let user: User = {
  uname: "小王",
  uage: 22,
};
console.log(user);
console.log(user.uname);
console.log(user.uage);

// 支持任意属性的对象类型
// [propName: string | number] 这个是约定键以及键的类型，string | number联合类型，规定键的类型。any是值的类型
type UserType = {
  [key: string | number]: any;
};

let user1: UserType = {
  uname: "小王",
  uage: 22,
  usex: true,
  address: [1, 2, 3, 4, 5],
  info: {
    m: 10,
    n: 20,
  },
};
console.log(user);
console.log(user.uname);
console.log(user.uage);

// 通过接口定义对象类型
interface People {
  pname: string; // People类型的值，必须有pname属性。
  [key: string | number]: any;
}
let p1: People = {
  pname: "10",
  a: 10,
  b: true,
};

// type 和 interface 的区别。
